#include <iostream>
#include <vector>
#include <list>
#include <utility>

#include "common.h"

using namespace std;

/*
 * 本程序用于检测程序的参数是否重复
 * 使用方法：
 * 1. 增量检测 （增加新的选项时的检测）
 *    1. 在Debug模式下编译，自动生成test
 *    2. ./bin/argv [需要测试的参数]
 *	     例如： ./bin/argv --help # --help为新增加的参数
 *    3. 在检测完之后将参数添加到“选项列表”argument_list中
 * 2. 存量检测 （看已经存在的选项的数值重复）
 *    1. 同1.1
 *    2. 运行 ./bin/argv
*/

int main(int argc, char *argv[])
{
	vector<string> argument_list={ // 选项列表
		"-v", // 软件版本
		"--version", // 软件版本
		"-h", // 帮助
		"--help", // 帮助
	};

	using Timer::string_to_number;
	// 增量检测
	if(argc == 2){
		int num_of_argv = string_to_number(argv[1]);
		bool have_repeat = false;  // 是否出现重复
		cout << R"(string_to_number(")" <<argv[1] << R"(") = )" << num_of_argv << endl;
		for(string & var : argument_list){
			if(num_of_argv == string_to_number(var.c_str())){
				cout << var << R"( 与 )" << argv[1] << "转换后数值相同" << endl;
				have_repeat = true; // 出现重复
			}
		}
		if(have_repeat == false){
			cout << "到目前为止没有出现数值重复的选项！" << endl;
		}
	}else if(argc == 1){
	// 存量检测
		// list<string> option_list;
		// pair<int,decltype(option_list)> p;
		// list<decltype(p)> list;
		list<pair<int,list<string>>> arg_list;
		for(string & var : argument_list){
			int num = string_to_number(var.c_str());
			// 查找是否已经存在
			auto it = arg_list.begin();
			for( ; it != arg_list.end(); ++it){
				if((*it).first == num){
					break;
				}
			}
			if(it != arg_list.end()){ // 已经存在这个数值
				(*it).second.push_back(var);
			}else{ // 没有这个数值
				pair<int,list<string>> p;
				p.first = num;
				p.second.push_back(var);
				arg_list.push_back(p);
			}
		}
		// 打印重复数值的选项
		for(auto & var : arg_list){
			if(var.second.size() > 1){
				cout << "num : " << var.first << endl; // 打印数值
				for(auto & str : var.second){
					cout << str << endl;
				}
				cout << "--------------------------------------------\n" << endl;
			}
		}
	}
	return 0;
}
